package it.unipg.bipod.dataAccess;

import it.unipg.bipod.dataModel.*;

import java.util.Properties;

/**
 * LocalDataManager fornisce metodi di accesso alle risorse locali di BiPoD.<br>
 * I metodi coprono le operazioni più comuni di lettura, inserimento e modifica
 * di entita':
 * <ul>
 * 	<li><b>getEntityFromID</b> : recupera un'entita' a partire dal suo ID.</li>
 * 	<li><b>updateEntity</b> : aggiorna i dati relativi all'entita' specificata.</li>
 *  <li><b>insertEntity</b> : inserisce un'entià. Il campo ID fornito viene ignorato.</li>
 *  <li><b>removeEntity</b> : rimuove un'entita'.
 *  <li><b>getAllEntities</b> : recupera tutte le entita' di un certo tipo.</li>
 * </ul>
 * Sono presenti anche ulteriori metodi che si occupano di cercare tutte le entita'
 * di un certo tipo a partire dalle loro chiavi esterne.
 * 
 * @author Lorenzo Porzi
 *
 */
interface LocalDataManager {
	
	/**
	 * Si connette alla sorgente di dati utilizzando le impostazioni fornite.
	 * 
	 * @param settings Un {@link java.util.Properties} di impostazioni
	 * @throws DataAccessException
	 */
	public void connect(Properties settings) throws DataAccessException;
	
	/**
	 * Recupera dal database l'entita' avente l'id specificato. Il metodo
	 * riconosce automaticamente il tipo di entita' da recuperare.
	 * 
	 * @param entity l'entita' da recuperare.
	 * @param id l'id da cercare.
	 * @return {@code true} se la ricerca va a buon fine, {@code false} altrimenti
	 * @throws DataAccessException
	 */
	public boolean getEntityFromId(Object entity, int id) throws DataAccessException;
	
	/**
	 * Inserisce l'entita' specificata nella base di dati locale.
	 * 
	 * @param entity l'entita' da inserire. Se l'inserimento va a buon fine
	 * il campo id dell'entita' viene aggiornato con il valore generato.
	 * @return {@code true} se l'inserimento va a buon fine, {@code false} altirmenti.
     * @throws DataAccessException
	 */
	public boolean insertEntity(Object entity) throws DataAccessException;
	
	/**
	 * Aggiorna l'entita' specificata. Più precisamente questo metodo
	 * aggiorna il record della base di dati locale avente id uguale a quello
	 * dell'entita' specificata impostando tutti gli altri campi in modo da rispecchiare
	 * quelli dell'argomento.
	 * 
	 * @param entity l'entita' da aggiornare.
	 * @return {@code true} se l'aggiornamento va a buon fine, {@code false} altirmenti.
	 * @throws DataAccessException
	 */
	public boolean updateEntity(Object entity) throws DataAccessException;
	
	/**
	 * Rimuove l'entita' specificata dalla base di dati locale.
	 * 
	 * @param entity l'entita' da rimuovere.
	 * @return {@code true} se la rimozione va a buon fine, {@code false} altirmenti.
     * @throws DataAccessException
	 */
	public boolean removeEntity(Object entity) throws DataAccessException;
	
	/**
	 * Recupera tutte le entita' di un certo tipo dalla base di dati locale.
	 * 
	 * @param entityClass la classe delle entita' da recuperare.
	 * @return un array di {@code Object} contenente le entita' recuperate. {@code null} se
	 * non si trova nessuna entita'.
	 * @throws DataAccessException
	 */
	public Object[] getAll(Class<?> entityClass) throws DataAccessException;
	
	/* -------------------------------------------------
	 * Recupero di entita' a partire dalle chiavi esterne
	 * ------------------------------------------------- */
	
	/**
	 * Cerca nella base di dati locale le entita' {@code Insegnamento} aventi
	 * il campo Bando specificato.
	 * 
	 * @param idBando l'id del Bando.
	 * @return un array contenente le entita' trovate.
	 * @throws DataAccessException
	 */
	public Insegnamento[] getInsegnamentoFromBando(int idBando) throws DataAccessException;
	
	/**
	 * Cerca nella base di dati locale le entita' {@code Insegnamento} aventi
	 * il campo Corso specificato
	 * 
	 * @param idCorso l'id del Corso
	 * @return un array contenente le entita' trovate
	 * @throws DataAccessException
	 */
	public Insegnamento[] getInsegnamentoFromCorso(int idCorso) throws DataAccessException;
	
	/**
	 * Cerca nella base di dati locale le entita' {@code Operazione} aventi
	 * il campo Utente specificato
	 * 
	 * @param idUtente l'id dell'Utente
	 * @return un array contenente le entita' trovate
	 * @throws DataAccessException
	 */
	public Operazione[] getOperazioneFromRegistrazione(int idUtente) throws DataAccessException;
	
	/**
	 * Cerca nella base di dati locale l'entita' {@code Registrazione} avente
	 * il campo Utente specificato
	 * 
	 * @param utente il campo Utente da cercare
	 * @return l'entita' trovata
	 * @throws DataAccessException
	 */
	public Registrazione getRegistrazioneFromUtente(String utente) throws DataAccessException;
	
	/**
	 * Cerca nella base di dati locale le entita' {@code Richiesta} aventi
	 * il campo Docente specificato
	 * 
	 * @param idDocente l'id del Docente
	 * @return un array contenente le entita' trovate
	 * @throws DataAccessException
	 */
	public Richiesta[] getRichiestaFromRegistrazione(int idDocente) throws DataAccessException;
	
	/**
	 * Cerca nella base di dati locale le entita' {@code Richiesta} aventi
	 * il campo Insegnamento specificato
	 * 
	 * @param idInsegnamento l'id dell'Insegnamento
	 * @return un array contenente le entita' trovate
	 * @throws DataAccessException
	 */
	public Richiesta[] getRichiestaFromInsegnamento(int idInsegnamento) throws DataAccessException;
	
	/**
	 * Cerca nella base di dati locale le entita' {@code Registrazione} corrispondenti
	 * ai docenti che hanno fatto richiesta per un certo insegnamento.
	 * 
	 * @param idInsegnamento l'id dell'Insegnamento
	 * @return un array contenente le entita trovate
	 * @throws DataAccessException
	 */
	public Registrazione[] getRegistrazioneFromInsegnamento(int idInsegnamento) throws DataAccessException;
	
	/* ------------
	 * Altri metodi
	 * ------------ */
	
	/**
	 * Cerca un entita' corso avente il campo nome specificato
	 * 
	 * @param nome il nome da controllare
	 * @return il corso trovato oppure {@code null}
	 */
	public Corso getCorsoFromNome(String nome) throws DataAccessException;

}